home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / beans / ReflectionUtils.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  4.7 KB  |  249 lines

  1. package java.beans;
  2.  
  3. import com.sun.beans.ObjectHandler;
  4. import java.lang.ref.Reference;
  5. import java.lang.ref.SoftReference;
  6. import java.lang.reflect.Constructor;
  7. import java.lang.reflect.Field;
  8. import java.lang.reflect.Method;
  9. import java.lang.reflect.Modifier;
  10. import java.util.ArrayList;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.ListIterator;
  14. import java.util.Map;
  15. import sun.reflect.misc.ConstructorUtil;
  16. import sun.reflect.misc.MethodUtil;
  17. import sun.reflect.misc.ReflectUtil;
  18.  
  19. class ReflectionUtils {
  20.    private static Reference methodCacheRef;
  21.  
  22.    public static Class typeToClass(Class var0) {
  23.       return var0.isPrimitive() ? ObjectHandler.typeNameToClass(var0.getName()) : var0;
  24.    }
  25.  
  26.    public static boolean isPrimitive(Class var0) {
  27.       return primitiveTypeFor(var0) != null;
  28.    }
  29.  
  30.    public static Class primitiveTypeFor(Class var0) {
  31.       if (var0 == Boolean.class) {
  32.          return Boolean.TYPE;
  33.       } else if (var0 == Byte.class) {
  34.          return Byte.TYPE;
  35.       } else if (var0 == Character.class) {
  36.          return Character.TYPE;
  37.       } else if (var0 == Short.class) {
  38.          return Short.TYPE;
  39.       } else if (var0 == Integer.class) {
  40.          return Integer.TYPE;
  41.       } else if (var0 == Long.class) {
  42.          return Long.TYPE;
  43.       } else if (var0 == Float.class) {
  44.          return Float.TYPE;
  45.       } else if (var0 == Double.class) {
  46.          return Double.TYPE;
  47.       } else {
  48.          return var0 == Void.class ? Void.TYPE : null;
  49.       }
  50.    }
  51.  
  52.    private static boolean matchArguments(Class[] var0, Class[] var1) {
  53.       return matchArguments(var0, var1, false);
  54.    }
  55.  
  56.    private static boolean matchExplicitArguments(Class[] var0, Class[] var1) {
  57.       return matchArguments(var0, var1, true);
  58.    }
  59.  
  60.    private static boolean matchArguments(Class[] var0, Class[] var1, boolean var2) {
  61.       boolean var3 = var0.length == var1.length;
  62.  
  63.       for(int var4 = 0; var4 < var0.length && var3; ++var4) {
  64.          Class var5 = var1[var4];
  65.          if (var5.isPrimitive()) {
  66.             var5 = typeToClass(var5);
  67.          }
  68.  
  69.          if (var2) {
  70.             if (var0[var4] != var5) {
  71.                var3 = false;
  72.             }
  73.          } else if (var0[var4] != null && !var5.isAssignableFrom(var0[var4])) {
  74.             var3 = false;
  75.          }
  76.       }
  77.  
  78.       return var3;
  79.    }
  80.  
  81.    static Method getPublicMethod(Class var0, String var1, Class[] var2) throws NoSuchMethodException {
  82.       Method var3 = findPublicMethod(var0, var1, var2);
  83.       if (var3 == null) {
  84.          throw new NoSuchMethodException(var0.getName() + "." + var1);
  85.       } else {
  86.          return var3;
  87.       }
  88.    }
  89.  
  90.    public static Method findPublicMethod(Class var0, String var1, Class[] var2) {
  91.       if (var2.length == 0) {
  92.          try {
  93.             return MethodUtil.getMethod(var0, var1, var2);
  94.          } catch (NoSuchMethodException var7) {
  95.             return null;
  96.          } catch (SecurityException var8) {
  97.          }
  98.       }
  99.  
  100.       Method[] var3 = MethodUtil.getPublicMethods(var0);
  101.       ArrayList var4 = new ArrayList();
  102.  
  103.       for(int var5 = 0; var5 < var3.length; ++var5) {
  104.          Method var6 = var3[var5];
  105.          if (var6.getName().equals(var1) && matchArguments(var2, var6.getParameterTypes())) {
  106.             var4.add(var6);
  107.          }
  108.       }
  109.  
  110.       if (var4.size() > 0) {
  111.          if (var4.size() == 1) {
  112.             return (Method)var4.get(0);
  113.          } else {
  114.             ListIterator var9 = var4.listIterator();
  115.  
  116.             while(var9.hasNext()) {
  117.                Method var10 = (Method)var9.next();
  118.                if (matchExplicitArguments(var2, var10.getParameterTypes())) {
  119.                   return var10;
  120.                }
  121.             }
  122.  
  123.             return getMostSpecificMethod(var4, var2);
  124.          }
  125.       } else {
  126.          return null;
  127.       }
  128.    }
  129.  
  130.    private static Method getMostSpecificMethod(List var0, Class[] var1) {
  131.       Method var2 = null;
  132.       int var3 = 0;
  133.       int var4 = var3;
  134.       ListIterator var5 = var0.listIterator();
  135.  
  136.       while(var5.hasNext()) {
  137.          Method var6 = (Method)var5.next();
  138.          Class[] var7 = var6.getParameterTypes();
  139.          var3 = 0;
  140.  
  141.          for(int var8 = 0; var8 < var1.length; ++var8) {
  142.             Class var9 = var7[var8];
  143.             if (var9.isPrimitive()) {
  144.                var9 = typeToClass(var9);
  145.             }
  146.  
  147.             if (var1[var8] == var9) {
  148.                ++var3;
  149.             }
  150.          }
  151.  
  152.          if (var3 == 0 && var4 == 0) {
  153.             if (var2 == null) {
  154.                var2 = var6;
  155.             } else if (!matchArguments(var2.getParameterTypes(), var6.getParameterTypes())) {
  156.                var2 = var6;
  157.             }
  158.          } else if (var3 > var4) {
  159.             var4 = var3;
  160.             var2 = var6;
  161.          } else if (var3 == var4) {
  162.             var2 = null;
  163.          }
  164.       }
  165.  
  166.       return var2;
  167.    }
  168.  
  169.    public static Method findMethod(Class var0, String var1, Class[] var2) {
  170.       Method var3 = findPublicMethod(var0, var1, var2);
  171.       if (var3 != null && Modifier.isPublic(var3.getDeclaringClass().getModifiers())) {
  172.          return var3;
  173.       } else {
  174.          for(Class var4 = var0; var4 != null; var4 = var4.getSuperclass()) {
  175.             Class[] var5 = var4.getInterfaces();
  176.  
  177.             for(int var6 = 0; var6 < var5.length; ++var6) {
  178.                var3 = findPublicMethod(var5[var6], var1, var2);
  179.                if (var3 != null) {
  180.                   return var3;
  181.                }
  182.             }
  183.          }
  184.  
  185.          return null;
  186.       }
  187.    }
  188.  
  189.    public static synchronized Method getMethod(Class var0, String var1, Class[] var2) {
  190.       Signature var3 = new Signature(var0, var1, var2);
  191.       Object var4 = null;
  192.       Object var5 = null;
  193.       boolean var6 = false;
  194.       if (ReflectUtil.isPackageAccessible(var0)) {
  195.          var6 = true;
  196.       }
  197.  
  198.       if (var6 && methodCacheRef != null && (var5 = (Map)methodCacheRef.get()) != null) {
  199.          Method var7 = (Method)((Map)var5).get(var3);
  200.          if (var7 != null) {
  201.             return var7;
  202.          }
  203.       }
  204.  
  205.       Method var8 = findMethod(var0, var1, var2);
  206.       if (var6 && var8 != null) {
  207.          if (var5 == null) {
  208.             var5 = new HashMap();
  209.             methodCacheRef = new SoftReference(var5);
  210.          }
  211.  
  212.          ((Map)var5).put(var3, var8);
  213.       }
  214.  
  215.       return var8;
  216.    }
  217.  
  218.    public static Constructor getConstructor(Class var0, Class[] var1) {
  219.       Constructor var2 = null;
  220.       Constructor[] var3 = ConstructorUtil.getConstructors(var0);
  221.  
  222.       for(int var4 = 0; var4 < var3.length; ++var4) {
  223.          if (matchArguments(var1, var3[var4].getParameterTypes())) {
  224.             var2 = var3[var4];
  225.          }
  226.       }
  227.  
  228.       return var2;
  229.    }
  230.  
  231.    public static Object getPrivateField(Object var0, Class var1, String var2) {
  232.       return getPrivateField(var0, var1, var2, (ExceptionListener)null);
  233.    }
  234.  
  235.    public static Object getPrivateField(Object var0, Class var1, String var2, ExceptionListener var3) {
  236.       try {
  237.          Field var4 = var1.getDeclaredField(var2);
  238.          var4.setAccessible(true);
  239.          return var4.get(var0);
  240.       } catch (Exception var5) {
  241.          if (var3 != null) {
  242.             var3.exceptionThrown(var5);
  243.          }
  244.  
  245.          return null;
  246.       }
  247.    }
  248. }
  249.